/*
 * settings_manager.h
 * 设置管理模块头文件
 * 
 * 说明：该模块负责应用配置的保存和加载，包括串口设置、显示设置等。
 */

#ifndef SETTINGS_MANAGER_H
#define SETTINGS_MANAGER_H

#include <QObject>
#include <QSettings>
#include <QString>
#include <QStringList>
#include <QByteArray>
#include <QVariant>
#include <QMap>

/**
 * @brief 串口配置结构体
 */
struct PortConfig {
    QString portName;      // 串口名称
    int baudRate;          // 波特率
    int dataBits;          // 数据位
    int parity;            // 校验位
    int stopBits;          // 停止位
    int flowControl;       // 流控制
};

/**
 * @brief 设置管理类，负责应用配置的保存和加载
 * 
 * 该类提供了配置的持久化存储功能，包括串口设置、显示设置、历史记录等的
 * 保存和加载，确保应用重启后能够恢复用户的偏好设置。
 */
class SettingsManager : public QObject
{
    Q_OBJECT

public:
    /**
     * @brief 构造函数
     * @param parent 父对象
     */
    explicit SettingsManager(const QString &organization, const QString &application, QObject *parent = nullptr);
    
    /**
     * @brief 析构函数
     */
    ~SettingsManager();
    
    /**
     * @brief 初始化默认设置
     */
    void initializeDefaults();
    
    /**
     * @brief 加载所有设置
     */
    void loadSettings();
    
    /**
     * @brief 保存所有设置
     */
    void saveSettings();
    
    /**
     * @brief 设置最近端口历史记录
     * @param ports 端口列表
     */
    void setRecentPortHistory(const QStringList &ports);
    QStringList getRecentPortHistory() const;
    void addToRecentPortHistory(const QString &portName, int maxItems);
    void addToPortHistory(const QString &portName);
    
    /**
     * @brief 设置端口配置
     * @param config 端口配置
     */
    void setPortConfig(const QString &portName, const QMap<QString, QString> &config);
    QMap<QString, QString> getPortConfig(const QString &portName) const;
    
    
    /**
     * @brief 设置窗口状态
     * @param state 窗口状态字节数组
     */
    void setWindowState(const QByteArray &geometry, const QByteArray &state);
    
    /**
     * @brief 获取窗口几何形状
     * @return 窗口几何形状字节数组
     */
    QByteArray getWindowGeometry() const;
    
    /**
     * @brief 获取窗口状态
     * @return 窗口状态字节数组
     */
    QByteArray getWindowState() const;
    
    /**
     * @brief 设置UI选项
     * @param option 选项名称
     * @param value 选项值
     */
    void setUiOption(const QString &option, const QVariant &value);
    
    /**
     * @brief 获取UI选项
     * @param option 选项名称
     * @param defaultValue 默认值
     * @return 选项值
     */
    QVariant getUiOption(const QString &option, const QVariant &defaultValue = QVariant()) const;
    
    /**
     * @brief 设置默认端口参数
     * @param baudRate 波特率
     * @param dataBits 数据位
     * @param stopBits 停止位
     * @param parity 校验位
     * @param flowControl 流控制
     */
    void setDefaultPortParameters(int baudRate, const QString &dataBits, const QString &stopBits, const QString &parity, const QString &flowControl);
    
    /**
     * @brief 获取默认波特率
     * @return 默认波特率
     */
    int getDefaultBaudRate() const;
    QString getDefaultDataBits() const;
    QString getDefaultStopBits() const;
    QString getDefaultParity() const;
    QString getDefaultFlowControl() const;
    
    
    /**
     * @brief 清除所有设置
     */
    void clearAllSettings();

private:
    QSettings *settings; // 设置对象
    // 最近端口历史记录
    QStringList recentPortHistory;
    // 端口配置映射：端口名 -> 参数键值
    QMap<QString, QMap<QString, QString>> portConfigs;
    // 窗口状态
    QByteArray windowGeometry;
    QByteArray windowState;
    // UI选项
    QMap<QString, QVariant> uiOptions;
    // 默认端口参数
    int defaultBaudRate;
    QString defaultDataBits;
    QString defaultStopBits;
    QString defaultParity;
    QString defaultFlowControl;
};


#endif // SETTINGS_MANAGER_H
